package cn.gok.day5;

import java.io.*;
import java.util.*;

/**
 * @ClassName HomeWork
 * @Description TODO
 * @Author HP
 * @Date 6:00 2022/7/9
 * @Version 1.0
 *
 * 1 创建类 School类：name,address,  birthYear成立的年份：int （2002；2010）
 *    实现序列化接口，void writeToFile();//采用对象流写入将两个school对象写入到 1.dat中，
 *    void readFromFile();//从1.dat中读取数据到对象，并显示出来

 * 2 创建类 Student：  int sid(学号) String name(姓名) ,int age;
 * 要求使用两种方法实现自定义比较规则： 先按学号排，如果学号学号重复，按年龄排。
 * 并遍历输出结果
 *
 *
 * 3  【提高】创建类 Pet: String name(宠物的名字) ,int feetCount（脚的个数）
 *
 *   设计类Family：String owner（主人），此外，每个家庭可以养有多只宠物（使用什么样的集合去存储宠物？？）。
 *
 *   a 创建2个family对象，分别拥有2只和3只宠物
 *
 *   b 写静态方法  ：   public static switchPets(Family f1,Famliy f2):  将两个家庭 脚最多的宠物进行互换。并输出互换后的结果。
 *     特别注意：如果有多只宠物的脚条数一样，任选一只进行调换即可。
 **/
public class HomeWork {
    public static void main(String[] args) throws IOException {
        /*
         * 1 创建类 School类：name,address,  birthYear成立的年份：int （2002；2010）
         *    实现序列化接口，void writeToFile();//采用对象流写入将两个school对象写入到 1.dat中，
         *    void readFromFile();//从1.dat中读取数据到对象，并显示出来
         */
//        Student student=new Student();
//        student.writeToFile();
//        System.out.println("文件写入完毕");
//        student.readFromFile();
        /*
         * 2 创建类 Student：  int sid(学号) String name(姓名) ,int age;
         * 要求使用两种方法实现自定义比较规则： 先按学号排，如果学号学号重复，按年龄排。
         * 并遍历输出结果
         */
//        第一种方法：实体类实现Comparable接口
//        Set<OscarStudent> set1=new TreeSet<>();
//        set1.add(new OscarStudent(194033531,"张三",22));
//        set1.add(new OscarStudent(194033503,"李四",21));
//        set1.add(new OscarStudent(194033548,"王五",22));
//        set1.stream().forEach(System.out::println);
//        第二种：类似匿名内部类
//        Set<OscarStudent> set2=new TreeSet<>(new Comparator<OscarStudent>() {
//            @Override
//            public int compare(OscarStudent o1, OscarStudent o) {
//                if(o1.getSid()==o.getSid()){
//                    //判断年龄相同保存
//                    if(o1.getAge()>o.getAge()){
//                        return 1;
//                    }
//                    return -1;
//                }
//                return o1.getSid()-o.getSid();
//            }
//        });
//        set2.add(new OscarStudent(194033531,"张三",22));
//        set2.add(new OscarStudent(194033503,"李四",21));
//        set2.add(new OscarStudent(194033548,"王五",22));
//        set2.stream().forEach(System.out::println);

//        提高题：a 创建2个family对象，分别拥有2只和3只宠物
        Map<Family,List<Pet>> map=new HashMap<>();
        List<Pet> list1=new ArrayList<>();
        list1.add(new Pet("鸡",2));
        list1.add(new Pet("猫",4));
        List<Pet> list2=new ArrayList<>();
        list2.add(new Pet("蛇",0));
        list2.add(new Pet("鳄鱼",4));
        list2.add(new Pet("老虎",4));
        Family f1=new Family("张三");
        Family f2=new Family("李四");
        map.put(f1,list1);
        map.put(f2,list2);
        Set<Family> set=map.keySet();
        System.out.println("换宠物之前：");
        set.stream().forEach(s-> System.out.println(s.getOwner()+"的宠物有："+map.get(s)));
        switchPets(f1,f2,map);
        System.out.println("换宠物之后：");
        set.stream().forEach(s-> System.out.println(s.getOwner()+"的宠物有："+map.get(s)));

    }
    public static void switchPets(Family f1,Family f2,Map<Family,List<Pet>> map){
//        将两个家庭 脚最多的宠物进行互换。并输出互换后的结果。特别注意：如果有多只宠物的脚条数一样，任选一只进行调换即可。
        Pet tp;
        tp=map.get(f1).get(getBig(map.get(f1)));
        map.get(f1).set(getBig(map.get(f1)),map.get(f2).get(getBig(map.get(f2))));
        map.get(f2).set(getBig(map.get(f2)),tp);
    }
    public static int getBig(List<Pet> list){
        int t=0;
        int index=0;
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).getFeetCount()>t){
                t=list.get(i).getFeetCount();
                index=i;
            }
        }
        return index;
    }
    static class Student implements Serializable {
        private String name;
        private String address;//地址
        private int birthYear;


        public Student() {
        }

        public Student(String name, String address, int birthYear) {
            this.name = name;
            this.address = address;
            this.birthYear = birthYear;
        }
        //采用对象流写入将两个school对象写入到 1.dat中
        public void writeToFile() throws IOException {
            ObjectOutputStream obos=new ObjectOutputStream(new FileOutputStream("D:\\Oscar\\Code\\Code1\\src\\cn\\gok\\day5\\1.dat"));
            for (int i = 0; i < 2; i++) {
                obos.writeObject(init());
            }


        }
        //从1.dat中读取数据到对象，并显示出来
        public void readFromFile() throws IOException {
            ObjectInputStream obin=new ObjectInputStream(new FileInputStream("D:\\Oscar\\Code\\Code1\\src\\cn\\gok\\day5\\1.dat"));
            try {
                while (true){
                    Object ob=obin.readObject();
                    System.out.println(ob);
                }
            }catch (EOFException | ClassNotFoundException e){
                System.out.println("文件读取完毕");
            }finally {
                obin.close();
            }
        }
//        工具类
        public Student init(){
            Scanner scanner=new Scanner(System.in);
            Student student=new Student();
            System.out.print("请输入学校名称：");
            student.setName(scanner.next());

            System.out.print("请输入学校地址：");
            student.setAddress(scanner.next());

            System.out.print("请输入学校成立年份：");
            try {
                student.setBirthYear(scanner.nextInt());
            }catch (InputMismatchException e){
                System.out.println("只输入年份就可以了哦！（提示：2001）");
                return init();
            }
//            student.setBirthYear(scanner.nextInt());

            return student;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public int getBirthYear() {
            return birthYear;
        }

        public void setBirthYear(int birthYear) {
            this.birthYear = birthYear;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", address='" + address + '\'' +
                    ", birthYear=" + birthYear +
                    '}';
        }
    }
}
